#!/usr/bin/python3
# coding:utf-8            
# 视频模块

import time

from loguru import logger
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC  # noqa
from selenium.webdriver.support.ui import WebDriverWait

from . import utils


def process_video(browser, start_btn, list_task_title: str):
    error_count = 0
    max_errors = 5  # 最大错误次数

    try:
        skip_list = utils.load_skip_list()
        if list_task_title in skip_list:
            logger.info(f"课程 '{list_task_title}' 在跳过列表中，直接跳过")
            return

        # 点击视频开始按钮（无论按钮文本是什么）
        start_button = utils.find_exsit_element(browser, "div.yxtulcdsdk-course-player__back button")
        if start_button:
            logger.info("发现视频开始按钮，点击开始播放")
            utils.click_element(start_button, "点击视频开始按钮", 5)

        # 等待视频元素加载完成
        video_element = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "video"))
        )

        # 使用execute_script执行JavaScript代码来播放视频
        browser.execute_script("arguments[0].play();", video_element)
        logger.info("开始播放视频")

        # # 使用安全的鼠标点击方式
        try:
            ActionChains(browser).move_by_offset(200, 200).click().perform()
        except Exception:
            # 如果坐标超出边界，直接点击视频元素
            try:
                video_element.click()
            except Exception:
                logger.error("无法点击视频元素")

        # 使用JavaScript触发点击事件，避免元素遮挡问题
        browser.execute_script("arguments[0].click();", video_element)
        WebDriverWait(browser, 3).until(EC.staleness_of(start_btn))

        # 循环判断播放状态，处理一些问题
        logger.info("已开始课程播放，学习状态确认中")
        check_task_status(browser, list_task_title)
    except Exception as e:
        error_count += 1
        logger.error(f"处理视频课程 '{list_task_title}' 时发生错误: {e}")

        if error_count >= max_errors:
            logger.error(f"课程 '{list_task_title}' 错误次数超过限制，加入跳过列表")
            utils.add_to_skip_list(list_task_title)
        else:
            logger.info(f"课程 '{list_task_title}' 将在下次重试，当前错误次数: {error_count}")


def check_task_status(browser, list_task_title: str):
    """
    检查播放状态，如果未播放，则点击播放按钮
    """
    old_task_slot = ""
    error_count = 0
    max_errors = 5  # 最大错误次数

    while True:
        try:
            course_summary = utils.find_exsit_element(browser, "span.opacity8.ml8").text.strip()

            # 发现已学习完成就要退出了
            if course_summary == "已完成学习":
                logger.info(f"课程 '{list_task_title}' 学习完成")
                utils.add_to_skip_list(list_task_title)
                break

            # 使用更通用的选择器，匹配任何在播放器区域的按钮
            start_button = utils.find_exsit_element(browser, "div.yxtulcdsdk-course-player__back button")
            if start_button:
                logger.info("发现视频开始按钮，点击开始播放")
                utils.click_element(start_button, "点击视频开始按钮", 5)

            # 下面是系统的一些弹窗，必须处理之后才能继续学习
            confirm_dialog_btn = utils.find_exsit_element(browser, "div.yxtf-dialog__body button.yxtf-button--primary")
            if confirm_dialog_btn:
                # 进一步检查元素是否真正可见
                is_visible = browser.execute_script("""
                    return arguments[0].offsetParent !== null && 
                           window.getComputedStyle(arguments[0]).display !== 'none';
                """, confirm_dialog_btn)

                if is_visible:
                    logger.info("发现学习确认弹窗，点击继续学习")
                    browser.execute_script("arguments[0].scrollIntoView({block: 'center'});", confirm_dialog_btn)
                    time.sleep(1)
                    confirm_dialog_res = utils.click_element(confirm_dialog_btn, "点击继续学习按钮", 5)
                    if confirm_dialog_res:
                        logger.info("已成功点击继续学习按钮")
                    else:
                        logger.warning("普通点击失败，尝试JavaScript点击")
                        browser.execute_script("arguments[0].click();", confirm_dialog_btn)
                        time.sleep(2)

            # 获取右上角的倒计时
            task_slot_obj = utils.find_exsit_element(browser, ".yxt-color-warning")
            if task_slot_obj:
                task_slot = task_slot_obj.text
                logger.debug(f"检查学习状态：{course_summary}，剩余时间：{task_slot}")

                new_task_slot = f"{course_summary}_{task_slot}"
                if new_task_slot == old_task_slot:
                    logger.info("发现学习状态没有变化，可能是无效视频，加入跳过清单")
                    utils.add_to_skip_list(list_task_title)
                    time.sleep(1)
                    break

                old_task_slot = new_task_slot
                # 检查视频是否停止播放
                isplaying = browser.execute_script("return document.querySelector('video').paused")
                if isplaying:
                    logger.info("发现视频停止了，重置到开头并重新播放")
                    browser.execute_script("""
                        var video = document.querySelector('video');
                        if (video) {
                            video.currentTime = 0;
                            video.play();
                        }
                    """)
                    # ActionChains(browser).move_by_offset(200, 200).click().perform()

                # 检查视频加载失败
                bad_video_element = utils.find_exsit_element(browser, "div.jw-title-primary.jw-reset")
                if bad_video_element and "加载失败" in bad_video_element.text:
                    logger.info(f"发现视频加载失败，加入跳过清单")
                    utils.add_to_skip_list(list_task_title)
                    time.sleep(1)
                    break
            else:
                logger.info(f"检查学习状态：{course_summary}")

            # 重置错误计数
            error_count = 0

            # 使用智能等待而不是固定睡眠
            WebDriverWait(browser, 30).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "body")))

        except NoSuchElementException:
            error_count += 1
            logger.error(f"找不到必要的元素，可能的页面结构变化。错误次数: {error_count}")
            if error_count >= max_errors:
                logger.error(f"课程 '{list_task_title}' 错误次数超过限制，加入跳过列表")
                utils.add_to_skip_list(list_task_title)
                break
            time.sleep(5)
            continue

        except TimeoutException:
            error_count += 1
            logger.error(f"等待超时，可能是网络或服务器问题。错误次数: {error_count}")
            if error_count >= max_errors:
                logger.error(f"课程 '{list_task_title}' 错误次数超过限制，加入跳过列表")
                utils.add_to_skip_list(list_task_title)
                break
            continue

        except Exception as e:
            error_count += 1
            logger.error(f"处理课程 '{list_task_title}' 时发生未预期错误: {e}，错误次数: {error_count}")
            if error_count >= max_errors:
                logger.error(f"课程 '{list_task_title}' 错误次数超过限制，加入跳过列表")
                utils.add_to_skip_list(list_task_title)
                break
            time.sleep(5)
            continue
        finally:
            time.sleep(10)
